--- 道胜/海峰 热量表
module(..., package.seeall)
--modbus=[[3,0,2,1,1],[3,24,2,2,1]]
        --[[瞬时],[累计]]
--[1、读取命令03,2、起始地址0,3、读取寄存器个数,4、数据类型：1=float 2=UINT 3=DOUBLE,4=Short 5、1=小端2=大端]
local logtag = "MODBUS_G"
local dtu, udtu = {}, {}
local isIns,redIns,redVal = false,false,false --先读取累计流量
local val,ins,addr =nil,nil,1
function setDtu(_dtu, _udtu)
    dtu, udtu = _dtu, _udtu
    addr = udtu.addr and tonumber(udtu.addr) or 1
    if udtu.modA and tonumber(udtu.modA[1]) then
        udtu.modA[1] =  tonumber(udtu.modA[1])
        udtu.modA[2] =  tonumber(udtu.modA[2])
        udtu.modA[3] =  tonumber(udtu.modA[3])
        udtu.modA[4] =  tonumber(udtu.modA[4])
        udtu.modA[5] =  tonumber(udtu.modA[5])
        udtu.modA[6] =  tonumber(udtu.modA[6])
        redIns = true
    end
    if udtu.modB and tonumber(udtu.modB[1]) then
        udtu.modB[1] =  tonumber(udtu.modB[1])
        udtu.modB[2] =  tonumber(udtu.modB[2])
        udtu.modB[3] =  tonumber(udtu.modB[3])
        udtu.modB[4] =  tonumber(udtu.modB[4])
        udtu.modB[5] =  tonumber(udtu.modB[5])
        udtu.modB[6] =  tonumber(udtu.modB[6])
        redVal = true
    end
    if redIns or redVal then
        if udtu and tonumber(udtu.dtype) == 99 then sys.taskInit(init) end
    else 
        lcd.LCD_DATA[3] = "MODBUS 无效配置"
    end
end
local function packVal(data,mod)
    local v_hex =  data:sub(4, 3 + mod[3]*2)
    local fmt = ">"
    if mod[5] and mod[5]==1 then
        if mod[3]==4 then
            v_hex =data:sub(10, 11)..data:sub(8, 9)..data:sub(6, 7)..data:sub(4, 5)
        else
            v_hex =data:sub(6, 7)..data:sub(4, 5)
        end
    end
    if mod[4]==1 then
        fmt = fmt .. "f"
    elseif mod[4]==2 then
        fmt = fmt .. "I"
    elseif mod[4]==3 then
        fmt = fmt .. "d"
    elseif mod[4]==4 then
        fmt = fmt .. "H"
    end
    local _t, _v = pack.unpack(v_hex,fmt)
    _v = _v and _v * (mod[6] or 1)
    return _v
end
local function _pro(data)
    if isIns and redIns then
        ins = string.format("%.2f",packVal(data,udtu.modA))
        lcd.LCD_DATA[3]= "瞬时:"..ins
        isIns = false
    elseif redVal then
        val = string.format("%.2f",packVal(data,udtu.modB))
        lcd.LCD_DATA[3]= "累计:"..val
        isIns = true
    end
    if val then usrdata.update({val,ins or 0}) end
end
function init()
    power.openBoost()
    sys.wait(200)
	while true do
        if isIns and redIns then
            tools.modbus_send(3,addr,udtu.modA[1],udtu.modA[2],udtu.modA[3])
        elseif redVal then
            tools.modbus_send(3,addr,udtu.modB[1],udtu.modB[2],udtu.modB[3])
        end
        local result, d = sys.waitUntil("UART_READ_DONE_NEXT_3" , 5000)
        if result then
            if d then
                _pro(d)
            end
            sys.wait(5000)
        else
            lcd.LCD_DATA[3] = "MODBUS READ TIMEOUT"
        end
	end
end
